import java.util.*;
import java.io.*;
public class test {
    // 数组中的最长连续子序列
    public static int MLS(int[] arr) {
// write code here
        return maxLengthOfLIS(arr);
    }

    public static int maxLengthOfLIS(int[] nums) {
// 1. 创建dp[]表
        int n = nums.length;
        int[] dpUp = new int[n];
        int[] dpDown = new int[n];
// 2. 初始化
        int max = 1;
//将所有情况先初始化为1,省去中间步骤
        Arrays.fill(dpUp, 1);
        Arrays.fill(dpDown, 1);
// 3. 填表
        for (int i = 1; i < n; i++) {
            for (int j = i - 1; j >= 0; j--) {
//找小于nums[i]的第一个数
                if (nums[i] > nums[j]) {
                    dpUp[i] = Math.max(dpUp[i], dpUp[j] + 1);
                }
//找大于nums[i]的第一个数
                if (nums[i] < nums[j]) {
                    dpDown[i] = Math.max(dpDown[i], dpDown[j] + 1);
                }
            }
            max = Math.max(Math.max(dpUp[i], max), dpDown[i]);
        }
// 4. 返回值
        return max;
    }

    // 字母收集
    public static void main(String[] args) throws IOException {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        HashMap<Character, Integer> map = new HashMap<>();
        map.put('l', 4);
        map.put('o', 3);
        map.put('v', 2);
        map.put('e', 1);
        char[][] nums = new char[n + 1][m + 1];
        for (int i = 1; i <= n; i++) {
            String s = in.next();
            for (int j = 1; j <= m; j++) {
                nums[i][j] = s.charAt(j - 1);
            }
        }
// 1. 创建dp表
//代表小红在[i][j]位置时能获得的最大得分
        int[][] dp = new int[n + 1][m + 1];
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
//由上面和左边的最大值 + 当前分数组成
                dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + map.getOrDefault(nums[i][j], 0);
            }
        }
        System.out.println(dp[n][m]);
    }
    // 牛客 添加逗号
    public static void main1(String[] args) throws IOException {
        Scanner in = new Scanner(System.in);
        String s = in.next();
        StringBuilder st = new StringBuilder(s);
        StringBuilder st0 = new StringBuilder();
        st = st.reverse();
        int len = s.length();
        int index = 0;
        while(index + 3 < len){
            String tmp = st.substring(index,index += 3);
            st0.append(tmp + ",");
        }
        st0.append(st.substring(index,len));
        st0.reverse();
        System.out.println(st0);
    }
    // 牛客 跳台阶
    public static void main2(String[] args) throws IOException {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
// 1. 创建dp表
//代表青蛙从0跳到i有多少种跳法
        int[] dp = new int[50];
// 2. 初始化
//跳一个台阶
        dp[1] = 1;
//跳两个台阶
        dp[2] = 2;
// 3. 填表
        if(n <= 2){
            System.out.println(dp[n]);
            return;
        }
        for(int i = 3;i <= n;i++){
//当前位置可以由上一节或上两节跳跃得到
            dp[i] = dp[i - 1] + dp[i - 2];
        }
// 4. 返回值
        System.out.println(dp[n]);
    }
    // 牛客 扑克牌顺子
    public boolean IsContinuous (int[] numbers) {
//两副扑克牌
//大小王:0(可以看作任意牌) A:1 J:11 Q:12 K:13
        Arrays.sort(numbers);
//获取牌中最大值
        int max = 0;
//获取牌中最小值
        int min = 14;
//获取牌的个数
        int[] arr = new int[14];
//获取从[不为0]开始的下标
        int index = 0;
        for(int i = 0;i < 5;i++){
            max = Math.max(max,numbers[i]);
            if(numbers[i] != 0) {
                min = Math.min(min,numbers[i]);
            } else {
                index++;
            }
            arr[numbers[i]]++;
//重复牌,直接返回false
            if(numbers[i] != 0 && arr[numbers[i]] > 1){
                return false;
            }
        }
//五张牌不够衔接,直接返回false
        if(max - min >= 5){
            return false;
        }
        return true;
    }
// 0 0 0 0 0
// 0 0 1 0 2
// 0 2 0 3 0
// 0 0 0 0 4
// 0 0 0 2 0
}
